// 实际使用例子
// 假设调用 cistrstr("Hello World", "world")：

//     外层循环遍历 h = "Hello World" 的每个字符，当 h 指向 'W' 时进入内层循环。
//     内层循环比较：
//         n[0] = 'w' → 转小写是 'w'，h[0] = 'W' → 转小写也是 'w' → 匹配；
//         n[1] = 'o' 和 h[1] = 'o' → 匹配；
//         直到 n[4] = 'd' 和 h[4] = 'd' 匹配，此时 n[5] 是 '\0'（子串结束）。
//     函数返回 h 指向 'W' 的地址，即找到 “world” 在 “Hello World” 中的位置。

char *cistrstr(const char *h, const char *n)
{
    size_t i;
    // 1. 处理特殊情况：如果要查找的子串（n）是空字符串，直接返回原字符串（h）的起始地址
    if (!n[0])
        return (char *)h;
    // 2. 外层循环：遍历“干草堆”字符串 h 的每个字符，作为匹配的起始位置
    for (; *h; ++h)
    {
        // 3. 内层循环：从当前 h 的位置开始，逐字符比较 h 和 n（忽略大小写）
        for (i = 0; n[i] && tolower((unsigned char)n[i]) == tolower((unsigned char)h[i]); ++i)
            ; // 循环体为空，仅靠循环计数和条件判断
        // 4. 如果内层循环走完了整个子串 n（即 n[i] 变成了 '\0'），说明找到匹配
        if (n[i] == '\0')
            return (char *)h; // 返回当前 h 的地址（子串 n 在 h 中首次出现的起始位置）
    }
    // 5. 遍历完 h 都没找到 n，返回 NULL（表示无匹配）
    return NULL;
}

// static char *
// cistrstr(const char *h, const char *n)
// {
//     size_t i;
//     if (!n[0])
//         return (char *)h;
//     for (; *h; ++h)
//     {
//         for (i = 0; n[i] && tolower((unsigned char)n[i]) ==
//                                 tolower((unsigned char)h[i]);
//              ++i)
//             ;
//         if (n[i] == '\0')
//             return (char *)h;
//     }
//     return NULL;
// }